package com.example.testing.lifecycle;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.example.testing.R;

public class LifecycleActivity extends Activity {
    private static final String TAG = "LifecycleActivity";
    /**
     * 表示Activity正在被创建，这是生命周期的第一个方法。
     * 在这个方法里，我们可以做一些初始化的工作
     * 比如调用setContentView去加载界面布局资源、初始化Activity所需要的数据
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e(TAG, "onCreate: " );
        //恢复onSaveInstanceState中保存数据的一种方式，这里需要先判断savedInstanceState是否为null，只有有需要恢复的数据时，才不为null
        if (savedInstanceState != null) {
            String name = (String) savedInstanceState.get("name");
            Toast.makeText(this, "name:" + name, Toast.LENGTH_SHORT).show();
        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lifecycle);
        findViewById(R.id.tv_new).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(LifecycleActivity.this, NewActivity.class);
                startActivity(intent);
            }
        });
        findViewById(R.id.tv_transparent).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(LifecycleActivity.this, TransparentActivity.class);
                startActivity(intent);
            }
        });
        findViewById(R.id.tv_dialog).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(LifecycleActivity.this, DialogActivity.class);
                startActivity(intent);
            }
        });
    }

    /**
     * 表示Activity正在重新启动。一般情况下，当当前Activity从不可见重新变为可见状态时，onRestart就会被调用
     * 这种情形一般是用户行为所导致，比如用户按Home键切换到桌面或者用户打开了一个新的Activity，这时当前的Activity就会暂停，也就是
     * onPause和onStop被执行了，接着用户又回到了这个Activity,就会出现这种情况
     */
    @Override
    protected void onRestart() {
        Log.e(TAG, "onRestart: ");
        super.onRestart();
    }

    /**
     * 表示Activity正在被启动，即将开始，这时Activity已经可见了，但是还没有出现在前台
     * 还无法和用户交互。这时候可以理解为Actiivty已经展示出来了，但是我们看不到
     * 可见的角度
     */
    @Override
    protected void onStart() {
        Log.e(TAG, "onStart: ");
        super.onStart();
    }

    /**
     * 表示Activity已经可见了，并且出现在前台开始活动。要注意这个和onStart的对比。
     * onStart和onResume都表示Activity已经可见了，但是onStart的时候Activity还在后台，
     * onResume的时候，Activity才显示到前台
     * 可交互的角度
     */
    @Override
    protected void onResume() {
        Log.e(TAG, "onResume: ");
        super.onResume();
    }

    /**
     * 表示Activity正在停止，正常情况下，紧接着onStop就会被调用。
     * 在特定情况下，如果这时候快速地回到当前Activity，那么onResume会被调用。
     * 此时可以做一些存储数据、停止动画等工作，但是注意不能太耗时，因为这会影响到新Activity的显示
     * 旧Activity的onPause方法执行完以后，新的Activity的onResume方法才会得到执行
     * 可交互的角度
     */
    @Override
    protected void onPause() {
        Log.e(TAG, "onPause: ");
        super.onPause();
    }

    /**
     * 当清单文件里配置了android:configChanges="orientation|screenSize"
     * 则屏幕旋转时，不会导致Activity重新创建，不会调用Activity的生命周期方法，也不会调用onSaveInstanceState和onRestoreInstanceState方法，
     * 只会调用该方法。
     * 不在清单文件里配置时，Activity会销毁并重启，所以会调用对应当生命周期方法和保存、恢复的方法，还要就是也会调用该方法
     * 注意，当minSdkVersion和targetSdkVersion有一个大于13时，上面当配置，必须加上screenSize
     * @param newConfig
     */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        Log.e(TAG, "onConfigurationChanged: ");
        super.onConfigurationChanged(newConfig);
    }

    /**
     * Activity异常终止重新创建时，会调用该方法，该方法的调用时间发生在onStart之后
     * 只要回调了该生命周期，savedInstanceState一定有值（也许时系统保存的），即调用过onSaveInstanceSate方法
     * 官方嗯党的建议时采用该方法去恢复数据
     * @param savedInstanceState
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.e(TAG, "onRestoreInstanceState:");
        String name = (String) savedInstanceState.get("name");
        Toast.makeText(this, "name:" + name, Toast.LENGTH_SHORT).show();
        super.onRestoreInstanceState(savedInstanceState);
    }

    /**
     * 该方法由于保存Activity的状态，一定发生在onStop之前，但是和onPause没有既定的时序关系
     * 这是当Activity被异常终止时调用这个方法，正常情况下，不会调用
     * 当Activity重新创建以后，系统会调用onRestoreInstanceState，并且把Activity销毁时onSaveInstanceState方法所
     * 保存的Bundle对象作为参数同时传给onRestoreInstanceState和onCreate方法。
     * 系统自动为我们做了一定的保存工作，比如保存Activity的视图结构、文本框用户的输入内容、listview的滚动位置
     * 每个View都有自己的onSaveInstanceState方法
     * 系统保存数据的流程：Activity调用onSaveInstanceState保存数据，然后Activity委托Window去保存，Window再委托它上面的顶级容器去保存数据，
     * 顶级View通知它的子元素来保存数据
     * @param outState
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.e(TAG, "onSaveInstanceState: ");
        super.onSaveInstanceState(outState);
        outState.putString("name", "josan");
    }

    /**
     * 表示Activity即将停止，可以做一些稍微重量级的回收工作，同样不能太耗时
     * 当启动一个新的Activity时，会回调该方法，但是如果新启动的Activity为透明的，或者非全屏的，则不会调用该方法
     * 可见的角度
     */
    @Override
    protected void onStop() {
        Log.e(TAG, "onStop: ");
        super.onStop();
    }

    /**
     * 表示Activity即将销毁，这是Activity生命周期的最后一个回调，在这里 ，我们可以做一些回收工作和最终的资源释放
     * 从导航栏中清除app,并不会回调该方法
     * Transparent
     */
    @Override
    protected void onDestroy() {
        Log.e(TAG, "onDestroy: ");
        super.onDestroy();
    }
}
